/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package MiniProjet.gestionnaires;

import MiniProjet.modeles.Acteur;
import MiniProjet.modeles.Film;
import MiniProjet.modeles.Genre;
import MiniProjet.modeles.Realisateur;
import MiniProjet.modeles.Rubrique;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.StringTokenizer;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.persistence.Query;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.PersistenceContext;

/**
 *
 * @author SaLaH
 */
@Stateless
public class GestionnaireFilms {
    
      @PersistenceContext
         private EntityManager em;

      @EJB
      GestionnaireRealisateurs gestionnaireRealisateurs;
      @EJB
      GestionnaireActeurs gestionnaireActeurs;
      @EJB
      GestionnaireRubriques gestionnaireRubriques;
       @EJB
      GestionnaireGenres gestionnaireGenres;



         String resume1 ="  Une vie entière pour se dire \"je t\'aime\". 80 ans pour démarrer une histoire d\'amour. Et tout ça à cause d'un jeu. Ou peut-être grâce à un jeu. Sophie et Julien ont défini les règles du jeu. ";
         String resume2 = "Parce qu'il est le spécialiste incontesté des livraisons à haut risque, Frank Martin se voit contraint, sous la menace, de transporter deux sacs imposants et une jeune Ukrainienne depuis Marseille jusqu'à Odessa ";
         String resume3 = " La dernière bataille pour le pouvoir met en scène des hommes contre des rois. La dernière bataille pour le pouvoir met en scène des hommes contre des rois.La dernière bataille pour le pouvoir met en scène des hommes contre des rois.";
         String resume4 = " À l’aube du treizième siècle, Robin Longstride, humble archer au service de la Couronne d’Angleterre, assiste, en Normandie, à la mort de son monarque, Richard Coeur de Lion, tout juste rentré de la Troisième Croisade et venu...";

         Collection<Acteur> acteurs = new ArrayList();
         Collection<Acteur> acteurs2 = new ArrayList();
         Collection<Acteur> acteurs3 = new ArrayList();
         Collection<Acteur> acteurs4 = new ArrayList();
         Collection<Rubrique> rubriques = new ArrayList();
         Collection<Rubrique> rubriques2 = new ArrayList();
         Collection<Genre> genres = new ArrayList();
         Collection<Genre> genres2 = new ArrayList();
         Collection<Genre> genres3 = new ArrayList();


         
  public Film creeFilm(String titre, double prix, int quantite, boolean disponibilite, String resume, String image, Collection<Genre> genres, Realisateur realisateur, Collection<Acteur> acteurs, Collection<Rubrique> rubriques) {

      Film f = new Film(titre, prix, quantite, disponibilite, resume, image, genres, realisateur, acteurs, rubriques);


        realisateur.getFilms().add(f);
        Iterator<Acteur> it = acteurs.iterator();
        Iterator<Rubrique> rb = rubriques.iterator();
        Iterator<Genre> ge = genres.iterator();

        while(it.hasNext()){
            Acteur act = it.next();
             f.getActeurs().add(act);
             act.getFilms().add(f);
        }

         while(rb.hasNext()){
            Rubrique rub = rb.next();
             f.getRubriques().add(rub);
             rub.getFilms().add(f);
        }

          while(ge.hasNext()){
            Genre gen = ge.next();
             f.getGenres().add(gen);
             gen.getFilms().add(f);
        }
     

        em.persist(f);
        return f;
    }


    public void creerFilmsDeTest() {

         acteurs.add(gestionnaireActeurs.getActeurByNom("Jason"));
         acteurs.add(gestionnaireActeurs.getActeurByNom("Natalya"));

         acteurs2.add(gestionnaireActeurs.getActeurByNom("Sam"));
         acteurs2.add(gestionnaireActeurs.getActeurByNom("Liam"));

         acteurs3.add(gestionnaireActeurs.getActeurByNom("Guillaume"));
         acteurs3.add(gestionnaireActeurs.getActeurByNom("Marion"));

         acteurs4.add(gestionnaireActeurs.getActeurByNom("Russell"));
         acteurs4.add(gestionnaireActeurs.getActeurByNom("Cate"));
         acteurs4.add(gestionnaireActeurs.getActeurByNom("Max von"));

         rubriques.add(gestionnaireRubriques.getRubriqueByNom("Nouveautes"));
         rubriques2.add(gestionnaireRubriques.getRubriqueByNom("Au cinema"));

         genres.add(gestionnaireGenres.getGenreByNom("Romance"));
         genres.add(gestionnaireGenres.getGenreByNom("Comedie"));

         genres2.add(gestionnaireGenres.getGenreByNom("Action"));

         genres3.add(gestionnaireGenres.getGenreByNom("Action"));
         genres3.add(gestionnaireGenres.getGenreByNom("Fantastique"));

      
 
        creeFilm("Jeux d'enfants", 1.0, 50 ,true,resume1,"jeuxdenfants.jpg",genres,gestionnaireRealisateurs.getRealisateurByNom("Yann"),acteurs3,rubriques);
        creeFilm("Transporteur", 1.5, 50,true,resume2,"transporteur.jpg",genres2,gestionnaireRealisateurs.getRealisateurByNom("Olivier"),acteurs,rubriques);
        creeFilm("Le Choc des Titans ", 4.0, 50,true,resume3,"chocDesTitans.jpg",genres3,gestionnaireRealisateurs.getRealisateurByNom("Louis"),acteurs2,rubriques2);
        creeFilm("Robin des Bois ", 5.0, 50,true,resume4,"robinDesBois.jpg",genres3,gestionnaireRealisateurs.getRealisateurByNom("Ridley"),acteurs4,rubriques2);

    }

  
    public Collection<Film> getAllFilms() {
        // Exécution d'une requête équivalente à un select *
       Query q = em.createQuery("select f from Film f");
        return q.getResultList();
    }

    @SuppressWarnings("empty-statement")
    public Collection<Film> getFilmsByTitre(String titre) {
        // Exécution d'une requête équivalente à un select *
      //  int i = 0;
        /*
         StringTokenizer st = new StringTokenizer(titre);
         int c = st.countTokens();
*/
         String valeur_requete = "select f from Film f where LOWER(f.resume) Like ?1 or LOWER(f.titre) Like ?1";


       Query q = em.createQuery(valeur_requete);
       String t = "%"+titre+"%";
       q.setParameter(1,t );
     
       
        return q.getResultList();
    }

     public Film getFilmById(long idFilm) {
        // Exécution d'une requête équivalente à un select *
       Query q = em.createQuery("select f from Film f where f.id = :id");
       q.setParameter("id", idFilm);
        return (Film) q.getSingleResult();
    }

      public  Film getFilmByNom(String titre){

         Film f = null;
         try{

          Query q = em.createQuery("select f from Film f where f.titre = :titre");
          q.setParameter("titre", titre);
          f = (Film) q.getSingleResult();

         }catch (NoResultException e) {
            System.out.println("Ce Realisateur n'existe pas.");
        }
        return f;


    }

      public Collection<Film> getFilmsByGenre(long genreId) {
        // Exécution d'une requête équivalente à un select *
     Query q = em.createQuery("select f from Film f where f.genre = :genre ");
     q.setParameter("genre", genreId);
    
     return q.getResultList();
    }

          public void updateProductQuantity(int id, int quantity) {
        Film film = this.getFilmById(id);
        int remainQuantity = film.getQuantite() - quantity;
        if (remainQuantity > 0) {
            film.setQuantite(remainQuantity);
        } else {
            film.setQuantite(0);
            film.setDisponibilite(false);
        }
    }


    // Add business logic below. (Right-click in editor and choose
    // "Insert Code > Add Business Method")
 
}
